package com.sz.common.core.system.service;

import com.sz.common.base.dto.TreeNode;
import com.sz.common.core.service.role.IRoleMemberService;
import com.sz.common.core.system.dto.OrgDto;
import com.sz.common.core.system.dto.UserOrgRelDto;
import com.sz.common.core.system.entity.Org;

import java.util.List;

/**
 * Function: OrgService <br>
 * Author: wentao.chang <br>
 * Date: 2016-10-18 09:43:00
 */
public interface OrgService extends IRoleMemberService {
    String MEMBERSHIP_TYPE_NAME = "ORG_GROUP";

    /**
     * @param orgDto
     * @return
     */
    int saveOrg(int orgGourpId, OrgDto orgDto);

    /**
     * @param orgGroupId
     * @param orgId
     * @param orgDto
     */
    void updateOrg(int orgGroupId, int orgId, OrgDto orgDto);

    /**
     * 批量更新
     *
     * @param orgs
     */
    void batchUpdateOrg(List<Org> orgs);

    /**
     * @param orgGourpId
     * @param parentid
     * @return
     */
    List<Org> getSubOrgs(int orgGourpId, int parentid);

    /**
     * @param orgGroupId
     * @param orgLongCode
     * @return
     */
    List<Org> getAllSubOrgsByLongCode(int orgGroupId, String orgLongCode);

    /**
     * @param orgGroupId 用户组id
     * @param q          查询关键字
     * @return
     */
    List<TreeNode> getOrgTreeByOrgGroupId(int orgGroupId, String q);

    /**
     * 拖动树节点
     *
     * @param orggourpid     组织所在的组
     * @param orgid          拖动组织的id
     * @param targetParentId 拖动到哪层节点
     * @param targetPreId    拖动到哪个节点后面
     */
    void dragOrgTree(int orggourpid, int orgid, int targetParentId, int targetPreId);

    /**
     * 同级内的组织上移下移
     *
     * @param orggourpid 组织所在的组
     * @param orgid      移动组织的id
     * @param direct     移动方向 -1向上移动 1向下移动
     */
    void shiftOrgTreeNode(int orggourpid, int orgid, int direct);

    /**
     * 根据用户Id查询组织机构
     *
     * @param userId
     * @return
     */
    List<Org> findByUserId(int userId);

    /**
     * 根据用户Id查询组织机构 如果用户被删除 则返null
     *
     * @param userId
     * @return
     */
    List<Org> findByUnDeletedUserId(int userId);

    /**
     * 根据userId查询用户所属部门
     *
     * @param userId
     * @return
     */
    Org findOrganizationByUserId(int userId);

    /**
     * 根据OrgCode查询组织机构
     *
     * @param orgGroupId
     * @param orgCode
     * @return
     */
    Org findByOrgCode(int orgGroupId, String orgCode);

    /**
     * @param orggourpid
     * @param orgid
     * @return
     */
    OrgDto findById(int orggourpid, int orgid);

    /**
     * @param orggourpid
     * @param orgid
     */
    void deleteOrgTreeNode(int orggourpid, int orgid);

    /**
     * @param orggourpid
     * @param parentid
     * @return
     */
    List<TreeNode> getSubOrgDtos(int orggourpid, int parentid);

    /**
     * @param orggroupid
     * @param orgId
     * @param roleId
     */
    void removeOrgRole(int orggroupid, int orgId, int roleId);

    /**
     * @param orggroupid
     * @param orgid
     * @param roleIds
     */
    void assignOrgRoles(int orggroupid, int orgid, String roleIds);

    /**
     * @param orggroupid
     * @param orgid
     * @param userIds
     */
    void assignOrgUsers(int orggroupid, int orgid, List<Integer> userIds);

    /**
     * @param orggroupid
     * @param userOrgs
     */
    void removeOrgUsers(int orggroupid, List<UserOrgRelDto> userOrgs);

    /**
     * @param orggroupid
     * @param q
     * @param porgid
     * @return
     */
    List<OrgDto> getOrgListByOrgGroupId(int orggroupid, String q, int porgid);

    /**
     * 检查组织编码
     *
     * @param orgGroupId
     * @param orgId
     * @param code
     * @return
     */
    void orgCodeCheck(int orgGroupId, int orgId, String code);

    /**
     * 检查组织名称
     *
     * @param orgGroupId
     * @param parentId
     * @param orgId
     * @param name
     * @return
     */
    void orgNameCheck(int orgGroupId, int parentId, int orgId, String name);

    /**
     * 检查组织简称
     *
     * @param orgGroupId
     * @param parentId
     * @param orgId
     * @param shortName
     * @return
     */
    void orgShortNameCheck(int orgGroupId, int parentId, int orgId, String shortName);

    /**
     * 根据用户userId获取所有的组织机构和用户分组列表
     *
     * @param userId
     * @return
     */
    List<Integer> getOrgByUserId(int userId);

    /**
     * 根据orgId获取所有父级orgCode
     *
     * @param orgId
     * @return
     */
    String[] getOrgParentByOrgId(int orgId);
    /**
     * @param orgid
     * @return
     */
    Org findById(int orgid);

}
